package com.company.floorExtract;

import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.util.Iterator;
import java.util.Random;

/**
 * Created by v on 17-4-22.
 */
public class FindByText {
    //楼层的正则表达式
    public static String reg="\\d{1,3}楼";

    //校验次数
    public static final int frequency=1;

    /**
     *
     * @param element
     * @return 那些text里面有x楼字样的tag
     */
    public static Elements findByText(Element element){
        Elements elements=new Elements();
        findByText(element,elements);
        return elements;
    }
    //递归函数
    private static void findByText(Element element,Elements elements){
        if(element.ownText().matches(reg)){
            elements.add(element);
        }

        Iterator<Element> iterator=element.children().iterator();

        while (iterator.hasNext()){
            findByText(iterator.next(),elements);
        }
    }

    /**
     *
     * @param element
     * @return 如果楼层数少于2则返回null，否则返回1,2楼的共同祖先
     */
    public static Elements findfloorTree(Element element){
        Elements elements=findByText(element);

        if (elements.size()<2) {
            return null;
        }

        //直接通过1,2号进行共同祖先的提取。
        Element parent=findSameParent(elements.get(0),elements.get(1));

        return findFloorExtractBySameParent(elements,parent);
    }

    /**
     *
     * @param a
     * @param b
     * @return 返回a和b的最小共同祖先.
     */
    private static Element findSameParent(Element a,Element b){
        Elements firstParent=new Elements();
        Elements secondParent=new Elements();

        //先把所有的父亲导出来，然后自上往下进行匹配
        while (a!=null){
            firstParent.add(a);
            a=a.parent();
        }
        while (b!=null){
            secondParent.add(b);
            b=b.parent();
        }

        int i=firstParent.size()-1;
        int j=secondParent.size()-1;
        while (firstParent.get(i).equals(secondParent.get(j))){
            i--;
            j--;
        }

        return firstParent.get(i+1);
    }

    /**
     *
     * @param elements 文本所在
     * @param parent 共同最小父亲
     * @return 楼层树
     */
    private static Elements findFloorExtractBySameParent(
            Elements elements,Element parent){
        Elements floorTree=new Elements();

        Iterator<Element> iterator=elements.iterator();

        while (iterator.hasNext()){
            Element element=iterator.next();
            while (!element.parent().equals(parent)){
                element=element.parent();
                if(element==null){
                    break;
                }
            }

            if(element!=null){
                floorTree.add(element);
            }
        }

        return floorTree;
    }
}
